# 第一种： 没有形参，也没有返回值
def text():
        print("小兔子乖乖")
        print("把门儿开开")
        print("快点儿开开")
        print("我要进来")

# 函数就是一堆准备好的代码 在需要的时候调用即可
"""
text()
a = input("输出yes调用函数，no不调用")
if a == "yes":
        text()
else:
        print("不调用")
"""

# 第二种： 有形参，没有返回值
"""
def eat(food):
        print(f"中午吃的是：{food}")

eat(56)
eat("脚丫子")
eat([1,1,3,5])
eat((1,1,3,5)) # 但是我们可以规定好，方法内部传的类型是什么

def eat_(food:str): # 这就规定好了，传递的参数是str类型
        print(f"中午吃的是：{food}")
eat_("脚丫子")
eat_(55)

def student_info(age:int,name:str,class_:str):
        print(f"大家好！我叫：{name}，是：{class_}班的，今年：{age}岁") # format
student_info(19,"赵本山","1404A 计科")
student_info(name="小刘",class_="啊啊",age=19)
"""

# 第三种：没有形参，但是有返回值
"""
return以后的代码块就不会再执行了
有return的函数，你可以使用变量来接收它
"""
"""
def classinfo():
        return "来测科技21期班级"

re = classinfo()
print(re) # 来测科技21期班级

def classinfo1():
        print("来测科技21期班级")
re = classinfo1()
print(re) # None
"""

# 第四种：有形参，也有返回值

def classinfo(cl):
        """
        :param cl:  选择班级号
        :return: 返回当前班级详情
        """
        if cl == "21":
                return "目前来测21期班级还在学习自动化测试"
        elif cl == "20":
                return "目前来测20期班级正在就业中"
        elif cl == "19":
                return "目前来测19期班级已经全部就业！"
        else:
                return "不存在的班级号！"

# print(classinfo("21"))
# print(classinfo("20"))
"""
def execute1():
        print("execute1开始执行了")
def execte2():
        execute1()
        print("execute2开始执行了")
execte2()
"""

# 函数的作用域
a = 100 # 全局变量
x = "hello1" # 全局变量
num = 0 # 全局变量
def text1():
        x = "hello"
        print('x = {}'.format(x))

        a = 10
        print("函数内部a = {}".format(a))

        # 想修改全局的变量
        global num
        num = 100
        print("函数内部num = {}".format(num))
        """
        locals():查看全部局部变量
        globals():查看全部全局变量
        """
        print("locals = {},globals= = {}".format(locals(), globals()))

# text1()
# print(num)
"""
就近原则使用，优先用函数内的变量，函数内没有，使用全局的
"""

# 闭包
"""
def func2():
        b = 100
        def func3():
                #声明一下
                nonlocal b # 在嵌套函数内，引用父函数中的值
                b += 1
                print(b)
        return func3

a = func2()
a()
a()

func2()() # 不推荐
print(func2()) # <function func2.<locals>.func3 at 0x0217E228>
"""

# 不定长参数 &&
def func3(*args): # *args 表示可以接收无限、不限个数的内容
        print(args)
func3(1,2,5,8,9,4,7,8,2,2,3,6,4)
# 它 返回的类型是一个元组

# 不定长需要注意一点，如果有正常的参数，你需要把不定长参数放到最后面
def func4(a,*b):
        print(a)
        print(b)
func4(5,"啊实打实",'asd','qwe',458,[2165,1234,56]) # a = 5 ,b = 'asd'。。。

"""
def func5(*b,a): # 可以这么定义，但是不正常
        print(a)
        print(b)

func5('asdas','asdsa',a = 123156)
"""

# 不定长关键字参数

def func5(**kwargs): # **表示不定长关键字参数
        print(kwargs)

func5(姓名="关博文",年龄=19,性别="女") # {'姓名': '关博文', '年龄': 19, '性别': '女'}

# 如果不定长参和不定长关键参一起都有了
def func6(*agrs,**kwargs):
        print(agrs,kwargs)

func6(123,456,123,"asd",姓名="小白")





